writing reusable code